import axios from "axios";
import Vue from "vue";
import md5 from "js-md5";
import router from '@/router'
import { getToken, removeToken, removeWxUserinfoCookies } from '@/api/auth'
// export default function $axios(options) {
//   return new Promise((resolve, reject) => {
const handleBigNumber = (data) => {
    if (typeof data !== 'object' || !data) return data;

    for (let key in data) {
        if (typeof data[key] === 'number' && data[key].toString().length >= 16) {
            data[key] = data[key].toString();
        } else if (typeof data[key] === 'object') {
            data[key] = handleBigNumber(data[key]);
        }
    }
    return data;
};

axios.defaults.baseURL = "/";
axios.defaults.timeout = 15000; // 请求超时
// axios.defaults.baseURL = 'http://47.104.188.246:6755/appApi'
// axios.defaults.headers["isGod"] = true;
axios.defaults.headers.post["Content-Type"] = "application/json;charset=UTF-8";

// request 拦截器
axios.interceptors.request.use(
    config => {
        if (config.url !== 'api/pay/queryOrderStatus' || config.url !== 'api/com/getLoginUserInfo') {
            Vue.$vux.loading.show()
        }
        // Vue.$vux.loading.show()
        // 获取缓存中的 token
        const token = getToken();
        // 如果token存在，则统一设置请求头
        if (token) {
            config.headers["X_USER_TOKEN"] = token;
        }
        // 1. 请求开始的时候可以结合 vuex 开启全屏 loading 动画
        // Vue.$vux.loading.show();
        //根据请求方法，序列化传来的参数，根据后端需求是否序列化
        if (config.method === "post") {
            var timestamp = Date.parse(new Date());
            var code = "dfasuiyhkuhjk2t5290wouojj2020eeqwqdfd";
            var arr = [];
            var sign = "";
            if (config.data != undefined) {
                for (const key in config.data) {
                    if (typeof config.data[key] == "string") {
                        arr.push(config.data[key]);
                    }
                }
                arr = arr.sort();
                arr.forEach(e => {
                    sign += e;
                });
            }
            sign += code;
            sign += timestamp;
            config.headers.timestamp = timestamp;
            config.headers.sign = md5(sign);
        }
        return config;
    },

    error => {
        // 请求错误时
        console.log("request:", error);
        // 1. 判断请求超时
        if (
            error.code === "ECONNABORTED" &&
            error.message.indexOf("timeout") !== -1
        ) {
            Vue.$vux.loading.hide();
            Vue.$vux.toast.show({
                text: error
            })

            // return service.request(originalRequest);// 再重复请求一次
        }
        // 2. 需要重定向到错误页面
        const errorInfo = error.response;
        if (errorInfo) {
            error = errorInfo.data; // 页面那边catch的时候就能拿到详细的错误信息,看最下边的Promise.reject
            alert(error.message)
        }
        return Promise.reject(error); // 在调用的那边可以拿到(catch)你想返回的错误信息
    }
);
// response 拦截器
axios.interceptors.response.use(
    response => {
        let data;
        // IE9时response.data是undefined，因此需要使用response.request.responseText(Stringify后的字符串)
        if (response.data == undefined) {
            data = JSON.parse(response.request.responseText);
        } else {
            data = handleBigNumber(response.data);
        }
        if (response.config.url == 'api/pay/queryOrderStatus') {
            // Vue.$vux.loading.hide();
            return data;
        } else if (response.config.url == 'api/com/getLoginUserInfo') {
            Vue.$vux.loading.hide();
            if (data.code !== 200) {
                // 401 清除token 和 微信信息重新授权和登录
                try {
                    const storage = window.localStorage
                    storage.clear()
                } catch (err) {
                    console.log("清理localStorage失败:" + err);
                }
                try {
                    removeToken();
                    removeWxUserinfoCookies();
                } catch (err) {
                    console.log("清理token失败:" + err);
                }
                router.push({ path: "/" })

            }
            return data;
        } else {
            Vue.$vux.loading.hide();
            if (data.code !== 200) {
                // 全局错误捕捉
                if (data.code === 500) {
                    // 当后端返回 500 时，弹出提示框展示详细错误信息
                    if (data.data === "您尚未注册或注册申请尚未通过，请到注册页面查看！") {
                        return data;
                    } else {
                        const message = data.message ? data.message : "" + data.data ? ":" + data.data : "";
                        Vue.$vux.alert.show({
                            title: "提示",
                            content: message == "" ? "服务端返回了错误" : message
                        });
                    }
                } else {
                    // 根据返回的code值来做不同的处理
                    switch (data.code) {
                        case 1:
                            break;
                        case 401:
                            // 401 清除token 和 微信信息重新授权和登录
                            try {
                                console.log("清理localStorage");
                                const storage = window.localStorage
                                storage.clear()
                            } catch (err) {
                                console.log("清理localStorage失败:" + err);
                            }
                            try {
                                console.log("清理token和WxUserinfo");
                                removeToken();
                                removeWxUserinfoCookies();
                            } catch (err) {
                                console.log("清理token失败:" + err);
                            }
                            router.push({ path: "/" })

                            break;
                        case 404:

                            break;
                        case 400:
                            // Vue.$vux.loading.hide();
                            Vue.$vux.toast.show({
                                text: data.message
                            })

                            break;
                        default:
                            break;
                    }
                }
            }
        }
        return data;


    },
    err => {
        console.log(err)

        if (err && err.response) {
            switch (err.response.status) {
                case 400:
                    Vue.$vux.loading.hide();
                    // 检查是否是 token 无效的情况
                    if (err.response.data && err.response.data.message === "未能读取到有效 token" ||
                        (err.response.data && err.response.data.message.indexOf("token 无效") != -1)) {
                        Vue.$vux.confirm.show({
                            title: '提示',
                            content: '您还未登录，是否前往登录？',
                            onConfirm() {
                                // 清除本地存储和 token
                                try {
                                    const storage = window.localStorage;
                                    storage.clear();
                                } catch (err) {
                                    console.log("清理localStorage失败:", err);
                                }
                                try {
                                    removeToken();
                                    removeWxUserinfoCookies();
                                } catch (err) {
                                    console.log("清理token失败:", err);
                                }
                                // 跳转到登录页
                                router.push('/login');
                            }
                        });
                    } else {
                        Vue.$vux.toast.show({
                            text: err.response.data.message || "请求错误"
                        });
                    }
                    err.message = "请求错误";
                    break;
                case 401:
                    err.message = "验签失败";
                    break;
                case 403:
                    // 检查是否是 token 无效的情况
                    if (err.response.message === "未能读取到有效 token" ||
                        (err.response.message && err.response.message.indexOf("token 无效") != -1)) {
                        Vue.$vux.confirm.show({
                            title: '提示',
                            content: '您还未登录，是否前往登录？',
                            onConfirm() {
                                // 清除本地存储和 token
                                try {
                                    const storage = window.localStorage;
                                    storage.clear();
                                } catch (err) {
                                    console.log("清理localStorage失败:", err);
                                }
                                try {
                                    removeToken();
                                    removeWxUserinfoCookies();
                                } catch (err) {
                                    console.log("清理token失败:", err);
                                }
                                // 跳转到登录页
                                router.push('/login');
                            }
                        });
                    } else {
                        err.message = "拒绝访问";
                        Vue.$vux.toast.show({
                            text: err.response.data.message || "拒绝访问"
                        });
                    }
                    break;
                case 404:
                    err.message = `请求地址出错: ${err.response.config.url}`;
                    break;
                case 408:
                    err.message = "请求超时";
                    break;
                case 500:
                    Vue.$vux.loading.hide();
                    Vue.$vux.toast.show({
                        text: err
                    })
                    err.message = "服务器内部错误";
                    break;
                case 501:
                    err.message = "服务未实现";
                    break;
                case 502:
                    err.message = "网关错误";
                    break;
                case 503:
                    err.message = "服务不可用";
                    break;
                case 504:
                    err.message = "网关超时";
                    break;
                case 505:
                    err.message = "HTTP版本不受支持";
                    break;
                default:
            }
        }
        Vue.$vux.loading.hide();
        return Promise.reject(err); // 返回接口返回的错误信息
    }
);

export default axios
